package com.xjm_cloud_admin.controller;

import com.xjm_cloud_admin.annotation.Anonymous;
import com.xjm_cloud_admin.domain.vo.req.*;
import com.xjm_cloud_admin.service.XjmFileService;
import com.xjm_cloud_admin.util.R;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;

/**
 * 文件表(XjmFile)表控制层
 *
 * @author 浪漫写尽歌谱
 * @since 2024-04-24 13:16:56
 */
@RestController
@RequestMapping("/file")
public class XjmFileController {
    /**
     * 服务对象
     */
    @Resource
    private XjmFileService xjmFileService;

    /**
     * 查询文件列表
     *
     * @param vo 查询信息
     * @return 文件列表
     */
    @GetMapping("/tree")
    public R tree(@Valid FileListReqVo vo) {
        return xjmFileService.tree(vo);
    }

    /**
     * 新建文件夹
     *
     * @param vo 新建文件夹信息
     * @return 新建文件夹结果
     */
    @PostMapping("/new_folder")
    public R newFolder(@RequestBody @Valid NewFolderReqVo vo) {
        return xjmFileService.newFolder(vo);
    }

    /**
     * 检查是否有该文件
     *
     * @param vo 文件信息
     * @return 检查结果
     */
    @PostMapping("/check")
    public R check(@RequestBody() @Valid FileCheckReqVo vo) {
        return xjmFileService.check(vo);
    }

    /**
     * 分片上传文件
     *
     * @param vo 上传文件信息
     * @return 上传文件结果
     */
    @PostMapping("/chunk")
    public R uploadFile(@Valid UploadFileReqVo vo) {
        return xjmFileService.uploadFile(vo);
    }

    /**
     * 上传文件
     *
     * @param vo 上传文件信息
     * @return 上传文件结果
     */
    @PostMapping("/upload")
    public R upload(@Valid UploadReqVo vo) {
        return xjmFileService.upload(vo);
    }

    /**
     * 合并文件
     *
     * @param vo 需要合并的文件信息
     * @return 合并结果
     */
    @PostMapping("/merge")
    public R merge(@RequestBody @Valid MergeFileReqVo vo) {
        return xjmFileService.merge(vo);
    }

    /**
     * 预览图片
     *
     * @param id       文件id
     * @param response 响应体
     */
    @GetMapping("/preview/image/{id}")
    public void previewImage(@PathVariable String id, HttpServletResponse response) {
        xjmFileService.previewImage(id, response);
    }

    /**
     * 预览视频
     *
     * @param id       文件id
     * @param fileName 文件名称
     * @param response 响应体
     */
    @GetMapping("/preview/video/{id}/{fileName}")
    public void previewVideo(@PathVariable String id, @PathVariable String fileName, HttpServletResponse response) {
        xjmFileService.previewVideo(id, fileName, response);
    }


    /**
     * 删除文件
     *
     * @param vo 删除文件id
     */
    @PostMapping("/delete")
    public R delete(@RequestBody @Valid DeleteFileReqVo vo) {
        return xjmFileService.delete(vo);
    }


    /**
     * 获取回收站的文件列表
     */
    @GetMapping("/delete/list")
    public R delete() {
        return xjmFileService.deleteList();
    }


    /**
     * 还原文件
     */
    @PostMapping("/restore")
    public R restore(@RequestBody @Valid DeleteFileReqVo vo) {
        return xjmFileService.restore(vo);
    }

    /**
     * 搜索文件
     *
     * @param vo 搜索文件信息
     */
    @PostMapping("/search")
    public R restore(@RequestBody @Valid SearchFileReqVo vo) {
        return xjmFileService.search(vo);
    }


    /**
     * 下载文件
     *
     * @param response 响应体
     * @param token    请求体
     */
    @GetMapping("/download")
    @Anonymous
    public void download(@RequestParam String token, HttpServletResponse response) {
        xjmFileService.download(token, response);
    }

    /**
     * 创建下载链接
     *
     * @param vo 下载文件信息
     */
    @PostMapping("/created/download")
    public R createdDownload(@RequestBody @Valid DownloadFileReqVo vo) {
        return xjmFileService.createdDownload(vo);
    }

    /**
     * 分享链接创建下载链接
     *
     * @param httpServletRequest 下载文件信息
     */
    @GetMapping("/created/sharing/download")
    @Anonymous
    public R sharingCreatedDownload(HttpServletRequest httpServletRequest, @RequestParam String fileId) {
        return xjmFileService.sharingCreatedDownload(httpServletRequest, fileId);
    }

}


